package setting

import (
	"errors"
	"fmt"
	"os"
	"path/filepath"
	"runtime"

	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
)
var Conf = new(AppConfig)
type AppConfig struct{
	Name string `mapstructure:"name" json:"name"`
	Version string `mapstructure:"version" json:"version"`
	CleanupCron string `mapstructure:"cleanupcron" json:"cleanupcron"`
	*MysqlConfig `mapstructure:"mysql"`
	*RedisConfig `mapstructure:"redis"`
}	
type MysqlConfig struct{
	Host string `mapstructure:"host" json:"host"`
	Port int `mapstructure:"port" json:"port"`
	Name string `mapstructure:"name" json:"name"`
	User string `mapstructure:"user" json:"user"`
	PassWord string `mapstructure:"password" json:"password"`
	DBname          string `mapstructure:"dbname"`
	SetmaxidleConns int    `mapstructure:"setmaxidle_conns"`
	SetmaxopenConns int    `mapstructure:"setmaxopen_conns"`
}
type RedisConfig struct {
	Host         string `mapstructure:"host"`
	Port         int    `mapstructure:"port"`
	DB           int    `mapstructure:"db"`
	Password     string `mapstructure:"password"`
	PoolSize     int    `mapstructure:"pool_size"`
	MinidleConns int    `mapstructure:"minidle_conns"`
}
func Init() error {
	// viper.AddConfigPath("/shortUrl/config.yaml")
	_, filename, _, _ := runtime.Caller(0)
	rootDir := filepath.Dir(filepath.Dir(filename))

	viper.SetConfigName("config") // 配置文件名(不带扩展名)
	viper.SetConfigType("yaml")   // 配置文件类型
	viper.AddConfigPath(rootDir)  // 添加配置文件路径

	// 也可以添加其他备用路径
	viper.AddConfigPath(".")           // 当前工作目录
	viper.AddConfigPath("/app/shortUrl") // Docker容器中的绝对路径
	
	// 2. 用户主目录
	if home, err := os.UserHomeDir(); err == nil {
		viper.AddConfigPath(home)
	}
	
	// 3. 通过环境变量指定的路径
	if configPath := os.Getenv("CONFIG_PATH"); configPath != "" {
		viper.AddConfigPath(configPath)
	}

	if err := viper.ReadInConfig();err != nil{
		return errors.New("viper 读取配置失败")
	}
	if err := viper.Unmarshal(&Conf);err != nil{
		return errors.New("config 反序列化失败")
	}
	viper.WatchConfig()
	viper.OnConfigChange(func(in fsnotify.Event) {
		fmt.Println("配置文件被人修改...")
		if err := viper.Unmarshal(Conf); err != nil {
			panic(fmt.Errorf("unmarshal conf failed, err:%v", err))
		}
	})
	return nil
	
}